package com.px.project.module.ml.service;

import java.util.List;

import com.px.common.dto.BaseQueryDto;
import com.px.common.dto.ProcessExecuteDto;
import com.px.project.module.ml.dto.CommonWriteDto;
import com.px.project.module.ml.dto.team.take.stock.TeamTakeStockDraftDto;
import com.px.project.module.ml.dto.team.take.stock.TeamTakeStockDraftUpdateDto;
import com.px.project.module.ml.dto.team.take.stock.TeamTakeStockDto;
import com.px.project.module.ml.dto.team.take.stock.TeamTakeStockQueryDto;
import com.px.project.module.ml.entity.TeamTakeStockDao;
import com.px.project.module.ml.vo.team.take.stock.TeamTakeStockItemExcelVo;
import com.px.project.module.ml.vo.team.take.stock.TeamTakeStockItemVo;
import com.px.project.module.ml.vo.team.take.stock.TeamTakeStockVo;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;

import cn.hutool.core.date.DateTime;

/**
 * 物资系统》物资管理》物资盘点业务逻辑接口
 *
 * @author 品讯科技
 * @date 2024-08
 */
public interface ITeamTakeStockService extends IService<TeamTakeStockDao> {
    /**
     * 新增
     *
     * @param teamTakeStockDto 物资盘点
     * @return {@link Boolean} 状态标识
     */
    Boolean saveOne(ProcessExecuteDto<TeamTakeStockDto> teamTakeStockDto);

    /**
     * 新增草稿
     *
     * @param teamTakeStockDraft 物资盘点
     * @return {@link Boolean} 状态标识
     */
    Boolean saveDraftOne(TeamTakeStockDraftDto teamTakeStockDraft);

    /**
     * 获取列表（分页）
     *
     * @param baseQuery 分页
     * @param teamTakeStockQuery 查询条件
     * @return {@link Page}<{@link TeamTakeStockVo}> 列表
     */
    Page<TeamTakeStockVo> listOfPage(BaseQueryDto<TeamTakeStockDao> baseQuery, TeamTakeStockQueryDto teamTakeStockQuery);

    /**
     * 编辑草稿
     *
     * @param teamTakeStockDraftUpdate 物资盘点
     * @return {@link Boolean} 状态标识
     */
    Boolean updateDraftOne(TeamTakeStockDraftUpdateDto teamTakeStockDraftUpdate);

    /**
     * 根据ID删除单个
     *
     * @param id ID
     * @return {@link Boolean} 状态标识
     */
    Boolean deleteOne(Long id);

    /**
     * 获取列表（导出）
     *
     * @param teamTakeStockQuery 查询条件
     * @return {@link CommonWriteDto}<{@link TeamTakeStockItemExcelVo}> 列表
     */
    CommonWriteDto<TeamTakeStockItemExcelVo> findList(TeamTakeStockQueryDto teamTakeStockQuery);

    /**
     * 获取单条
     *
     * @param id ID
     * @return {@link TeamTakeStockVo} 物资盘点
     */
    TeamTakeStockVo getOfOne(Long id);

    /**
     * 审批流程
     *
     * @param teamTakeStockDto 物资盘点
     * @return {@link Boolean} 状态标识
     */
    Boolean executeTask(ProcessExecuteDto<TeamTakeStockDto> teamTakeStockDto);

    /**
     * 终止流程
     *
     * @param id 业务ID
     * @return {@link Boolean} 状态标识
     */
    Boolean terminate(Long id);

    /**
     * 获取领用人出库数据
     *
     * @param userId 用户ID
     * @param storeId 仓库ID
     * @return {@link List}<{@link TeamTakeStockItemVo}> 列表
     */
    List<TeamTakeStockItemVo> getItemOfOne(Long userId, Long storeId);

    /**
     * 查询当月/上月的盘点数据
     * 
     * @param beginOfMonth 开始时间
     * @param endOfMonth 结束时间
     * @return Integer
     */
    Integer getMonthCount(DateTime beginOfMonth, DateTime endOfMonth);
}